package com.module.ad.toutiao;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.CSJAdError;
import com.bytedance.sdk.openadsdk.CSJSplashAd;
import com.bytedance.sdk.openadsdk.TTAdLoadType;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.module.privacy.module_ad.LogADUtils;
import com.module.privacy.module_ad.SplashAdListener;
import com.module.privacy.module_ad.UIUtils;

public class TTSplashAd {
    private static boolean mIsExpress = false; //是否请求模板广告
    //开屏广告加载超时时间,建议大于3000,这里为了冷启动第一次加载到广告并且展示,示例设置了3000ms
    private static final int AD_TIME_OUT = 3000;
    private static final String TAG = "头条广告";

    public static void loadAd(Context context, String posId, SplashAdListener listener) {
        LogADUtils.d(TAG, "启动头条开屏广告");

        TTAdNative mTTAdNative = TTAdManagerHolder.get().createAdNative(context);
        //step3:创建开屏广告请求参数AdSlot,具体参数含义参考文档
        if (listener.getAdView() == null) {
            return;
        }
        int width = listener != null && listener.getAdView() != null ? listener.getAdView().getWidth() : 0;
        int height = listener != null && listener.getAdView() != null ? listener.getAdView().getHeight() : 0;

        listener.getAdView().post(new Runnable() {
            @Override
            public void run() {
                AdSlot adSlot = null;
                if (mIsExpress) {
                    //个性化模板广告需要传入期望广告view的宽、高，单位dp，请传入实际需要的大小，
                    //比如：广告下方拼接logo、适配刘海屏等，需要考虑实际广告大小
                    //float expressViewWidth = UIUtils.getScreenWidthDp(this);
                    //float expressViewHeight = UIUtils.getHeight(this);
                    adSlot = new AdSlot.Builder()
                            .setCodeId(posId)
                            //模板广告需要设置期望个性化模板广告的大小,单位dp,代码位是否属于个性化模板广告，请在穿山甲平台查看
                            //view宽高等于图片的宽高
                            .setExpressViewAcceptedSize(UIUtils.px2dip(context, width), UIUtils.px2dip(context, height))//dp
                            .setImageAcceptedSize(width, height)//px
                            .build();
                } else {
                    adSlot = new AdSlot.Builder()
                            .setCodeId(posId)
                            .setExpressViewAcceptedSize(UIUtils.px2dip(context, width), UIUtils.px2dip(context, height))//dp
                            .setImageAcceptedSize(width, height)//px
                            .setAdLoadType(TTAdLoadType.PRELOAD)//推荐使用，用于标注此次的广告请求用途为预加载（当做缓存）还是实时加载，方便后续为开发者优化相关策略
                            .build();
                }
                //step4:请求广告，调用开屏广告异步请求接口，对请求回调的广告作渲染处理
                mTTAdNative.loadSplashAd(adSlot, new TTAdNative.CSJSplashAdListener() {
                    /**
                     * 广告物料、素材加载成功回调
                     */
                    @Override
                    public void onSplashLoadSuccess() {

                    }

                    /**
                     * 广告渲染回调，接入方可以在这个回调中，调用ad.showSplashView(splashContainerView)进行渲染，也可以自己同个ad对象获取开屏view自己添加到容器进行渲染。
                     * @param ad 开屏广告接口
                     */
                    @Override
                    public void onSplashRenderSuccess(CSJSplashAd ad) {
                        if (ad == null) {
                            return;
                        }
                        if (listener == null || listener.getAdView() == null) {
                            return;
                        }
                        LogADUtils.d(TAG, "头条开屏广告加载成功");

                        ViewGroup adView = listener.getAdView();
                        boolean isFinish = listener.isFinishing();
                        //获取SplashView
                        View view = ad.getSplashView();
                        if (view != null && adView != null && !isFinish) {
                            adView.removeAllViews();
                            //把SplashView 添加到ViewGroup中,注意开屏广告view：width =屏幕宽；height >=75%屏幕高
                            adView.addView(view);
                            //设置不开启开屏广告倒计时功能以及不显示跳过按钮,如果这么设置，您需要自定义倒计时逻辑
                            //ad.setNotAllowSdkCountdown();
                            ad.setSplashAdListener(new CSJSplashAd.SplashAdListener() {
                                /**
                                 * 开屏展示
                                 */
                                @Override
                                public void onSplashAdShow(CSJSplashAd csjSplashAd) {

                                }

                                /**
                                 * 开屏点击
                                 */
                                @Override
                                public void onSplashAdClick(CSJSplashAd csjSplashAd) {

                                }

                                /**
                                 * 开屏关闭(开屏跳过以及倒计时结束统一收敛到该接口)
                                 */
                                @Override
                                public void onSplashAdClose(CSJSplashAd csjSplashAd, int i) {
                                    if (listener != null) {
                                        listener.goActivity();
                                    }
                                }
                            });
                        } else {
                            //开发者处理跳转到APP主页面逻辑
                            if (listener != null) {
                                listener.goActivity();
                            }
                        }
                    }

                    /**
                     *广告物料、素材加载失败或超时回调
                     *  * 如果媒体想判断是否是超时回调可以通过  csjAdError.getCode() == 23进行判断
                     *  * code为23则为超时回调
                     */
                    @Override
                    public void onSplashLoadFail(CSJAdError csjAdError) {
                        if (listener != null) {
                            listener.goActivity();
                        }
                        LogADUtils.d(TAG, csjAdError.getCode() == 23 ? "头条开屏广告超时" : csjAdError.getMsg());
                    }


                    /**
                     * 广告渲染失败或超时回调
                     * 如果媒体想判断是否是超时回调可以通过  csjAdError.getCode() == 23进行判断
                     * code为23则为超时回调
                     * @param csjAdError
                     */
                    @Override
                    public void onSplashRenderFail(CSJSplashAd csjSplashAd, CSJAdError csjAdError) {
                        if (listener != null) {
                            listener.goActivity();
                        }
                        LogADUtils.d(TAG, csjAdError.getCode() == 23 ? "头条开屏广告超时" : csjAdError.getMsg());
                    }
                }, AD_TIME_OUT);
            }
        });
    }
}
